package com.zjj.learn.designmodel.work.mediator;

public class MediatorTest {

    public static void main(String[] args) {
        //创建一个中介者
        MediatorObject mediator = new MediatorObject();
        //创建两个房东信息
        HouseOwner houseOwner1 = new HouseOwner("房东1");
        HouseOwner houseOwner2 = new HouseOwner("房东2");

        //创建三个租户信息
        Tenant tenant1 = new Tenant("租户1");
        Tenant tenant2 = new Tenant("租户2");
        Tenant tenant3 = new Tenant("租户3");

        //向中介者添加房东信息
        mediator.setHouseOwners(houseOwner1, houseOwner2);
        //向中介者添加租户信息
        mediator.setTenants(tenant1, tenant2, tenant3);
        //中介者发布房源信息，会依次通知每一个租户
        mediator.publicHouse("在清水河有一个一居室，500元 每月");
        //中介者发布租户需求，会依次通知每一个房东
        mediator.needHouse("我需要一个清水河的房子");

    }

    /**
     * 中介者模式的使用【迪米特法则的典型应用】
     *    在生活中，当我们租房获取房源信息，假设是房东直接和租户联系，那么，当某一个房东有房源信息时，就需要通知所有的租户
     *    当某一个人需要租房时租房时，就要就要咨询每一个房东相关房源信息，这样子一个发生变化时，很多都会发生变化。
     *    这个时候就可以想想可不可以有一个房屋中介，所有房东将所有的房源信息告诉中介，这样子当有租客想要租房时直接找房屋中介，就可以获取所有的房源信息了。
     *    就不需要咨询每一个房东了。
     *    同样的，当某个房东有新的房源信息时，就可以直接告诉房屋中介，就不需要一次告诉所有的需要租房的人了。
     *
     * 中介者模式的组成部分：
     *    1、抽象中介者（Mediator）：定义了中介者对象的接口，负责定义对象间的通信协议。
     *    2、具体中介者（Concrete Mediator）：实现了中介者接口，负责协调各个同事对象之间的交互关系。
     *    3、抽象同事类（Colleague）：定义了同事对象的接口，负责定义对象间的行为。
     *    4、具体同事类（Concrete Colleague）：实现了同事接口，负责实现具体的行为。
     *
     * 在租房案例中：
     *     抽象中介者：就是中介这个概念，有发布房源信息的方法
     *     具体中介者：实例一个抽象中介者
     *     抽象同事：人，房东和租房人员的概念
     *     具体同事：指具体的房东或者具体的租客
     *
     * 具体代码请见：
     *   {@link com.zjj.learn.designmodel.work.mediator}
     *   在案例中，当用户需要房子时，告诉中介者，中介者发布一个需要房子信息，那么就可以告诉所有的房东了。
     *   可以看中中介者模式和观察者模式是非常像的。
     *
     **/


    /**
     * 观察者模式和中介者模式的区别：
     *     都是行为型模式，都是处理一对多模型
     * 观察者模式：
     *     察者模式属于行为型模式，指多个对象间存在一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。
     *      这种模式有时又称作发布-订阅模式、模型-视图模式。
     *
     * 中介者模式：
     *     中介者模式，属于行为型模式；定义一个中介对象来封装一系列对象之间的交互，使原有对象之间的耦合松散，且可以独立地改变它们之间的交互。
     *     中介者模式又叫调停模式，它是迪米特法则的典型应用。
     *
     * 观察者模式：只能从从一的一方循环的通知，属于单向。（好比上课，只能老实授课给班上所有的学生，反过来不行）
     * 中介者模式：可以从任一方循环通知，属于双向。（好比分享会，每个人都可以分享自己的事情给别人）
     **/


}
